#pragma once
#include "PointLabCore/Prerequisites.h"
#include "PointLabCore/Entity.h"
#include "PointLabCore/Vector3.h"
#include "PointLabCore/Color.h"

namespace PointLabCore
{
	class POINTLABCORE_EXPORT IPointCloud :public PointLabCore::Entity
	{
	public:
		IPointCloud();
		~IPointCloud();

		virtual CLASS_TYPE classID()const override;

		virtual bool hasPoint()const;
		virtual PointLabCore::Uint getPointNum() const;
		virtual void resizePointNum(PointLabCore::Uint num);
		virtual void setPointCoord(PointLabCore::Uint pid, const PointLabCore::Vector3& coord);
		virtual PointLabCore::Vector3 getPointCoord(PointLabCore::Uint pid)const;
		virtual void appendPointCoord(const PointLabCore::Vector3& coord);

		virtual bool hasNormal()const;
		virtual PointLabCore::Uint getNormalNum()const;
		virtual void resizeNormalNum(PointLabCore::Uint num);
		virtual void setPointNormal(PointLabCore::Uint pid, const PointLabCore::Vector3& normal);
		virtual PointLabCore::Vector3 getPointNormal(PointLabCore::Uint pid)const;
		virtual void appendPointNormal(const PointLabCore::Vector3& normal);

		virtual bool hasColor()const;
		virtual PointLabCore::Uint getColorNum()const;
		virtual void resizeColorNum(PointLabCore::Uint num);
		virtual void setPointColor(PointLabCore::Uint pid, const PointLabCore::Color4& color);
		virtual PointLabCore::Color4 getPointColor(PointLabCore::Uint pid);
		virtual void appendPointColor(const PointLabCore::Color4& color);

		virtual void clearAll();

	private:
		std::vector<PointLabCore::Vector3> mPointList;
		std::vector<PointLabCore::Vector3> mNormalList;
		std::vector<PointLabCore::Color4> mColorList;
	};
}
